const db = require("../db/index"); // 数据库处理模块
const bcrypt = require("bcryptjs"); // 密码加密，解密模块
const jwt = require("jsonwebtoken"); // 导入生成token的包
const config = require("../config"); // 导入token配置文件
const { sendEmail } = require("node-send-email"); // 导入发送验证码模块

// 用户注册的处理函数
exports.regUser = (req, res) => {
  let userinfo = req.body;
  let referSql = `SELECT * from userinfo WHERE BINARY username = '${userinfo.nm}' OR userAcc = '${userinfo.acc}'`; // 判断用户名和手机号是否已经存在
  let reqSql = `INSERT INTO userinfo SET ?`; // 向用户表添加新用户
  const selSql = `SELECT * FROM emailcaptcha WHERE emailacc = '${userinfo.email}'`; // 查询验证码
  db.query(selSql, (err, data) => {
    if (err) return res.send(err);
    if (data.length) {
      if (data[0].captcha == userinfo.captcha) {
        // 判断用户名和手机号是否已经存在
        db.query(referSql, (err, data) => {
          if (err) return res.send(err);
          if (data[0]?.username == userinfo.nm) {
            return res.send({ code: 400, message: "该昵称已被注册" });
          } else if (data[0]?.userAcc == userinfo.acc) {
            return res.send({ code: 400, message: "该手机号已被注册" });
          } else {
            // 随机生成一个用户的ID
            let rdmNum = "";
            for (let i = 0; i < 9; i++) {
              rdmNum += Math.floor(Math.random() * 10); // [0,10)的整数
            }
            let refIdSql = `SELECT * from userinfo WHERE id = ${rdmNum}`; // 查询ID是否存在
            // 查询ID是否已经存在
            db.query(refIdSql, (err, data) => {
              if (err) return res.send(err);
              if (data.length > 0) {
                for (let i = 0; i < 20; i++) {
                  rdmNum += Math.floor(Math.random() * 10); // [0,10)的整数
                }
              }
            });
            // 对密码进行加密
            userinfo.pwd = bcrypt.hashSync(userinfo.pwd, 10);
            // 获取用户输入的信息
            let userObj = {
              id: rdmNum,
              username: userinfo.nm,
              userAcc: userinfo.acc,
              password: userinfo.pwd,
              email: userinfo.email,
              userPic: "",
            };
            db.query(reqSql, userObj, (err, data) => {
              if (err) return res.send(err);
              // 判断注册是否成功
              if (data.affectedRows !== 1) {
                return res.send({
                  code: 500,
                  message: "注册失败，请稍后再试！",
                });
              }
              res.send({
                code: 200,
                message: "注册成功",
              });
            });
          }
        });
      }
    } else {
      res.send({ code: 402, message: "该邮箱账号尚未获取验证码" });
    }
  });
};

// 用户登录的处理函数
exports.login = (req, res) => {
  let dlSql = `SELECT * FROM userinfo WHERE userAcc = ${req.body.acc}`;
  db.query(dlSql, (err, data) => {
    if (err) return res.send(err);
    // 判断查询的手机号是否存在
    if (data.length !== 1) {
      return res.send({ code: 400, message: "该手机号尚未注册" });
    }
    // 对密码进行解密判断
    const verifyPwd = bcrypt.compareSync(req.body.pwd, data[0].password);
    if (!verifyPwd) {
      return res.send({ code: 400, message: "密码输入错误" });
    }
    // 将id,密码剔除后返回
    const user = { ...data[0], password: "", userPic: "" };
    // 对用户的信息进行加密，生成token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, {
      expiresIn: "10h",
    });
    // 将生成的token字符串添加到用户的数据中
    data[0].token = "Bearer " + tokenStr;
    delete data[0].password;
    res.send({
      code: 200,
      message: "登录成功",
      data,
    });
  });
};

// 用户注销的处理函数
exports.logout = (req, res) => {
  let sql = `DELETE FROM userinfo where id = ${req.body.id}`;
  db.query(sql, (err, data) => {
    if (err) return res.send(err);
    if (data.affectedRows !== 1) {
      return res.send({ code: 500, message: "注销用户失败，请重新尝试" });
    }
    res.send({
      code: 200,
      message: "注销用户成功",
    });
  });
};

// 用户重置密码的处理函数
exports.updatePassword = (req, res) => {
  let sql = `select * from userinfo where id = ${req.body.id}`; // 查询是否存在修改密码的用户
  let upSql = `update userinfo set password = ? where id = ${req.body.id}`; // 重置当前用户的密码
  db.query(sql, (err, data) => {
    if (err) return res.send(err);
    if (data.length !== 1) return res.send("用户不存在");
    // 对密码进行解密判断
    const compareResult = bcrypt.compareSync(req.body.oldPwd, data[0].password);
    if (!compareResult) {
      return res.send({ code: 400, message: "旧密码错误" });
    }
    // 对密码进行加密
    let newPwd = bcrypt.hashSync(req.body.newPwd, 10);
    // 重置密码
    db.query(upSql, newPwd, (err, data) => {
      if (err) return res.send(err);
      if (data.affectedRows !== 1) return res.send("重置密码失败");
      res.send({ code: 200, message: "重置密码成功" });
    });
  });
};

// 发送验证码的处理函数
exports.getEmailCaptcha = async (req, res) => {
  const code = String(Math.floor(Math.random() * 1000000)).padEnd(6, "0"); //生成随机验证码
  const addSql = `INSERT INTO emailcaptcha SET emailacc='${req.query.acc}',captcha='${code}'`;
  const remSql = `DELETE FROM emailcaptcha where emailacc = '${req.query.acc}'`;
  //发送邮件需要的入参
  const params = {
    //邮箱类型，@qq.com就传qq，@163.com就是传163，不传的话默认为qq，
    //其余类型可以在node_modules/node-send-email/lib/service.js中找到。
    type: "qq",
    // 发件人
    name: "星迪照明",
    // 发件箱，要与收件箱邮箱类型一致
    from: "1078574279@qq.com",
    // 发件箱smtp,需要去邮箱—设置–账户–POP3/SMTP服务—开启—获取stmp授权码
    smtp: "wnvlaeibjmolfhec",
    // 发送的邮件标题
    subject: "验证码",
    // 收件箱，要与发件箱邮箱类型一致
    to: req.query.acc,
    // 邮件内容，HTML格式
    html: `
            <p>您好！</p>
            <p>您的验证码是：<strong style="color:orangered;">${code}</strong></p>
            <p>如果不是您本人操作，请无视此邮件</p>
        `,
  };

  await sendEmail(params, (result) => {
    if (result) {
      db.query(addSql, (err) => {
        if (err) return res.send(err);
        setTimeout(() => {
          db.query(remSql, (err) => {
            if (err) return res.send(err);
            console.log(err);
          });
        }, 60000);
      });
      res.send({ code: 200, msg: "发送验证码成功" });
    } else {
      res.send({ code: 500, msg: "发送验证码失败，请稍后重试" });
    }
  });
};

// 邮箱验证码登陆的处理函数
exports.emailLogin = (req, res) => {
  const selSql = `SELECT * FROM emailcaptcha WHERE emailacc = '${req.body.acc}'`;
  const loginSql = `SELECT * FROM userinfo WHERE email = '${req.body.acc}'`;
  db.query(selSql, (err, data) => {
    if (err) return res.send(err);
    if (data.length) {
      if (req.body.captcha == data[0].captcha) {
        db.query(loginSql, (err, data) => {
          if (err) return res.send(err);
          // 将id,密码剔除后返回
          const user = { ...data[0], password: "", userPic: "" };
          // 对用户的信息进行加密，生成token字符串
          const tokenStr = jwt.sign(user, config.jwtSecretKey, {
            expiresIn: "10h",
          });
          // 将生成的token字符串添加到用户的数据中
          data[0].token = "Bearer " + tokenStr;
          // 将密码剔除
          delete data[0].password;
          res.send({ code: 200, message: "验证成功", data });
        });
      } else {
        res.send({ code: 400, message: "验证码输入错误，请重新验证" });
      }
    } else {
      res.send({ code: 400, message: "该邮箱账号尚未获取验证码" });
    }
  });
};
